package com.tbynet.jwp.web;

import com.jfinal.aop.Inject;
import com.jfinal.core.Path;
import com.tbynet.jwp.framework.core.JwpController;
import com.tbynet.jwp.service.TermService;
import com.tbynet.jwp.service.dto.request.TermRequest;
import com.tbynet.jwp.service.dto.response.TermResponse;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;

/**
 * 前台分类项管理控制器
 * 负责接收前台相关的HTTP请求，调用Manager层处理业务，返回响应
 * 只负责路由转发，不包含任何业务逻辑
 *
 * @author 佰亿互联
 * @version 1.0
 * @since 2025-11-04
 */
@Path(value = "/web/portal/term", viewPath = "/web/")
public class TermPortalController extends JwpController {

    // 分类项管理器
    @Inject
    TermService termService;

    /**
     * 获取分类项详情
     * 对应路由：GET /portal/term/:id
     */
    public void get() {
        // 获取参数
        BigInteger termId = getParaToBigInteger("id");
        String taxonomy = getPara("taxonomy");

        // 调用Manager层获取分类项详情
        TermResponse.DetailInfo result = termService.getTermDetail(termId, taxonomy);

        // 返回响应
        if (result != null) {
            renderJson(buildSuccess("获取分类项详情成功", result));
        } else {
            renderJson(buildBusinessError("TERM_NOT_FOUND", "分类项不存在"));
        }
    }

    /**
     * 分页查询分类项列表
     * 对应路由：GET /portal/terms
     */
    public void list() {
        // 构建查询请求
        TermRequest request = new TermRequest();
        request.setTaxonomies(Arrays.asList(getParaValues("taxonomies")));
        request.setPageNumber(getParaToInt("page", 1));
        request.setPageSize(getParaToInt("size", 20));
        request.setOrderBy(getPara("orderBy"));
        request.setOrder(getPara("order"));
        request.setSearch(getPara("search"));
        request.setHideEmpty(getParaToBoolean("hideEmpty", false));

        // 调用Manager层获取分类项列表
        TermResponse.ListResult result = termService.listTerms(request);

        // 返回响应
        renderJson(buildSuccess("获取分类项列表成功", result));
    }

    /**
     * 获取分类项层级结构
     * 对应路由：GET /portal/term-hierarchy
     */
    public void hierarchy() {
        // 获取参数
        String taxonomy = getPara("taxonomy");
        BigInteger parentId = getParaToBigInteger("parentId");

        // 调用Manager层获取层级结构
        TermResponse.HierarchyResult result = termService.getTermHierarchy(taxonomy, parentId);

        // 返回响应
        renderJson(buildSuccess("获取分类项层级结构成功", result));
    }

    /**
     * 根据文章获取分类项
     * 对应路由：GET /portal/post/:postId/terms
     */
    public void getByPost() {
        // 获取参数
        BigInteger postId = getParaToBigInteger("postId");
        String taxonomy = getPara("taxonomy");

        // 调用Manager层获取文章分类项
        TermResponse.ListResult result = termService.getTermsByPostId(postId, taxonomy);

        // 返回响应
        renderJson(buildSuccess("获取文章分类项成功", result));
    }

    /**
     * 获取分类项统计信息
     * 对应路由：GET /portal/term-statistics
     */
    public void statistics() {
        // 调用Manager层获取统计信息
        TermResponse.Statistics result = termService.getTermStatistics();

        // 返回响应
        renderJson(buildSuccess("获取分类项统计信息成功", result));
    }

    /**
     * 搜索分类项
     * 对应路由：GET /portal/term/search
     */
    public void search() {
        // 获取参数
        String keyword = getPara("keyword");
        String taxonomy = getPara("taxonomy");
        Integer limit = getParaToInt("limit", 20);

        // 调用Manager层搜索分类项
        TermResponse.ListResult result = termService.searchTerms(keyword, taxonomy, limit);

        // 返回响应
        renderJson(buildSuccess("搜索分类项成功", result));
    }

    /**
     * 获取热门分类项
     * 对应路由：GET /portal/term/popular
     */
    public void popular() {
        // 获取参数
        String taxonomy = getPara("taxonomy");
        Integer limit = getParaToInt("limit", 10);

        // 构建请求，获取热门分类项（通过列表查询，按count降序）
        TermRequest request = new TermRequest();
        request.setTaxonomies(Collections.singletonList(taxonomy));
        request.setPageNumber(1);
        request.setPageSize(limit);
        request.setOrderBy("count");
        request.setOrder("DESC");
        request.setHideEmpty(true);

        // 调用Manager层获取分类项列表
        TermResponse.ListResult result = termService.listTerms(request);

        // 返回响应
        renderJson(buildSuccess("获取热门分类项成功", result));
    }
}